home *** CD-ROM | disk | FTP | other *** search
/ STraTOS 1997 April & May / STraTOS 1 - 1997 April & May.iso / CD01 / INTERNET / SITES / RAND / DVIEW000.LZH / DRAW2D.C < prev    next >
Encoding:
C/C++ Source or Header  |  1995-09-10  |  3.6 KB  |  157 lines

  1. #include <math.h>
  2.  
  3. #include "view.h"
  4.  
  5. #define min(x,y)  (((x) < (y)) ? (x) : (y))
  6. #define abs(x)    (((x) > 0) ? (x) : -(x))
  7.  
  8. extern char *screenbuf;
  9. extern short width;
  10. extern short height;
  11. extern short scale;
  12.  
  13. extern short wallcol;
  14.  
  15. void draw_line(short from, short to, short colour)
  16. {
  17.    long x1a, y1a, x2a, y2a;
  18.    double x1, y1, x2, y2, tmp;
  19.    double k, xd, yd;
  20.    vertex *Vertex;
  21.    char *pos;
  22.    long y, x;
  23.    static long sPangle = -1;
  24.    static double s, c;
  25.    long x1l, y1l, x2l, y2l, xl, yl, kl, tmpl;
  26.  
  27.    if (!wallcol)
  28.       colour = 0xff;
  29.  
  30.    Vertex = &Vertex_Array[from];
  31.    x1a = Px - Vertex->x;
  32.    y1a = Vertex->y - Py;
  33.    Vertex = &Vertex_Array[to];
  34.    x2a = Px - Vertex->x;
  35.    y2a = Vertex->y - Py;
  36.  
  37. #if 1
  38.    x1l = ((x1a * SinPangle) - (y1a * CosPangle)); /* Had >> 16 */
  39.    x2l = ((x2a * SinPangle) - (y2a * CosPangle));
  40.  
  41.    y1l = ((y1a * SinPangle) + (x1a * CosPangle));
  42.    y2l = ((y2a * SinPangle) + (x2a * CosPangle));
  43.    
  44.    x1l = x1l / scale + ((long)width << 15);
  45.    y1l = y1l / scale + ((long)(height * 3) << 14);   /* *0.75 */
  46.    x2l = x2l / scale + ((long)width << 15);
  47.    y2l = y2l / scale + ((long)(height * 3) << 14);
  48.  
  49. if (abs(y1l - y2l) > abs(x1l - x2l)) {
  50. /* Always draw from top to bottom (y1 -> y2) */
  51.    if (y1l > y2l) {
  52.       tmpl = y1l;
  53.       y1l = y2l;
  54.       y2l = tmpl;
  55.       tmpl = x1l;
  56.       x1l = x2l;
  57.       x2l = tmpl;
  58.    }
  59.    
  60.    kl = (x1l - x2l) / ((y1l - y2l) >> 16);
  61.  
  62.    x1l = x1l >> 16;
  63.    y1l = y1l >> 16;
  64.    x2l = x2l >> 16;
  65.    y2l = y2l >> 16;
  66.    pos = screenbuf + width * y1l;
  67.    for(y = y1l, xl = x1l << 16;y <= min(height - 1, y2l);y++, xl += kl) {
  68.         if ((y >= 0) && (xl >= 65535L) && (xl < ((long)width << 16))) {
  69.             *(pos + (xl >> 16)) = colour;
  70.         }
  71.         pos += width;    
  72.     }
  73. } else {
  74.    if (x1l > x2l) {
  75.       tmpl = y1l;
  76.       y1l = y2l;
  77.       y2l = tmpl;
  78.       tmpl = x1l;
  79.       x1l = x2l;
  80.       x2l = tmpl;
  81.    }
  82.    
  83.    kl = (y1l - y2l) / ((x1l - x2l) >> 16);
  84.  
  85.    x1l = x1l >> 16;
  86.    y1l = y1l >> 16;
  87.    x2l = x2l >> 16;
  88.    y2l = y2l >> 16;
  89.    pos = screenbuf + x1l;
  90.    for(x = x1l, yl = y1l << 16;x <= min(width - 1, x2l);x++, yl += kl) {
  91.         if ((x >= 0) && (yl >= 65535L) && (yl < ((long)height << 16))) {
  92.             *(pos + (yl >> 16) * width) = colour;
  93.         }
  94.         pos += 1;    
  95.     }
  96. }
  97. #else
  98.     if (Pangle != sPangle) {
  99.       s = sin((double)(-Pangle) / 65536L * 2 * M_PI);
  100.       c = cos((double)(-Pangle) / 65536L * 2 * M_PI);
  101.       sPangle = Pangle;
  102.    }
  103.  
  104.    x1 = x1a * s - y1a * c;
  105.    x2 = x2a * s - y2a * c;
  106.    y1 = y1a * s + x1a * c;
  107.    y2 = y2a * s + x2a * c;
  108.    
  109.    x1 = x1 / scale + width * 0.5;
  110.    y1 = y1 / scale + height * 0.5;
  111.    x2 = x2 / scale + width * 0.5;
  112.    y2 = y2 / scale + height * 0.5;
  113.  
  114. if (abs(y1 - y2) > abs(x1 - x2)) {
  115. /* Always draw from top to bottom (y1 -> y2) */
  116.    if (y1 > y2) {
  117.       tmp = y1;
  118.       y1 = y2;
  119.       y2 = tmp;
  120.       tmp = x1;
  121.       x1 = x2;
  122.       x2 = tmp;
  123.    }
  124.    
  125.    k = ((double)x1 - x2) / (y1 - y2);
  126.  
  127.    pos = screenbuf + width * (long)y1;
  128.    for(y = y1, xd = x1;y <= min((double)height - 1, y2);y++, xd += k) {
  129.         if ((y >= 0) && (xd >= 0) && (xd < width)) {
  130.             *(pos + (long)xd) = colour;
  131.         }
  132.         pos += width;    
  133.     }
  134. } else {
  135.    if (x1 > x2) {
  136.       tmp = y1;
  137.       y1 = y2;
  138.       y2 = tmp;
  139.       tmp = x1;
  140.       x1 = x2;
  141.       x2 = tmp;
  142.    }
  143.    
  144.    k = ((double)y1 - y2) / (x1 - x2);
  145.  
  146.    pos = screenbuf + (long)x1;
  147.    for(x = x1, yd = y1;x <= min((double)width - 1, x2);x++, yd += k) {
  148.         if ((x >= 0) && (yd >= 0) && (yd < height)) {
  149.             *(pos + (long)yd * width) = colour;
  150.         }
  151.         pos += 1;    
  152.     }
  153. }
  154. #endif
  155.  
  156. }
  157.